package com.loe.test.chart

import android.graphics.Color
import android.graphics.Typeface
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.data.PieEntry
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.formatter.PercentFormatter
import com.github.mikephil.charting.formatter.ValueFormatter

class PieChartManager(var chart: PieChart)
{
    private val textColor = Color.parseColor("#888888")

    init
    {
        initChart()
    }

    //初始化
    private fun initChart()
    {
        //  是否显示中间的洞
        chart.isDrawHoleEnabled = false
        chart.holeRadius = 40f //设置中间洞的大小
        // 半透明圈
        chart.transparentCircleRadius = 30f
        chart.setTransparentCircleColor(Color.WHITE) //设置半透明圆圈的颜色
        chart.setTransparentCircleAlpha(125) //设置半透明圆圈的透明度

        //饼状图中间可以添加文字
        chart.setDrawCenterText(false)
        chart.centerText = "民族" //设置中间文字
        chart.setCenterTextColor(textColor) //中间文字的颜色
        chart.setCenterTextSizePixels(36f) //中间文字的大小px
        chart.centerTextRadiusPercent = 1f
        chart.setCenterTextTypeface(Typeface.DEFAULT) //中间文字的样式
        chart.setCenterTextOffset(0f, 0f) //中间文字的偏移量
        chart.minAngleForSlices = 4f //最小角度
        chart.rotationAngle = 45f // 初始旋转角度
        chart.isRotationEnabled = false // 可以手动旋转
        chart.setUsePercentValues(true) //显示成百分比
        chart.description.isEnabled = false //取消右下角描述

        //是否显示每个部分的文字描述
        chart.setDrawEntryLabels(true)
        chart.setEntryLabelColor(Color.WHITE) //描述文字的颜色
        chart.setEntryLabelTextSize(15f) //描述文字的大小
        chart.setEntryLabelTypeface(Typeface.DEFAULT_BOLD) //描述文字的样式

        //图相对于上下左右的偏移
        chart.setExtraOffsets(40f, 10f, 40f, 20f)
        //图标的背景色
//        pieChart.setBackgroundColor(Color.WHITE);
//        设置pieChart图表转动阻力摩擦系数[0,1]
        chart.dragDecelerationFrictionCoef = 0.75f

        //获取图例
        val legend = chart.legend
        legend.isEnabled = false
        legend.orientation = Legend.LegendOrientation.HORIZONTAL //设置图例水平显示
        legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM //顶部
        legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER //右对其
        legend.formSize = 12f
        legend.xEntrySpace = 20f //x轴的间距
        legend.yEntrySpace = 0f //y轴的间距
        legend.yOffset = 28f //图例的y偏移量
        legend.xOffset = 10f //图例x的偏移量
        legend.textColor = textColor //图例文字的颜色
        legend.textSize = 18f //图例文字的大小
    }

    /**
     * 显示圆环
     */
    fun showRing(list: List<PieEntry>, colors: List<Int>)
    {
        //显示为圆环
        chart.isDrawHoleEnabled = true
        chart.holeRadius = 45f //设置中间洞的大小
        chart.setHoleColor(Color.TRANSPARENT)

        //数据集合
        val dataSet = PieDataSet(list, "")
        //填充每个区域的颜色
        dataSet.colors = colors
        //是否在图上显示数值
        dataSet.setDrawValues(false)
        //        文字的大小
        dataSet.valueTextSize = 16f
        //        文字的颜色
        dataSet.valueTextColor = textColor
        //        文字的样式
        dataSet.valueTypeface = Typeface.DEFAULT

//      当值位置为外边线时，表示线的前半段长度。
        dataSet.valueLinePart1Length = 0.4f
        //      当值位置为外边线时，表示线的后半段长度。
        dataSet.valueLinePart2Length = 0.3f
        //      当ValuePosits为OutsiDice时，指示偏移为切片大小的百分比
        dataSet.valueLinePart1OffsetPercentage = 80f
        // 当值位置为外边线时，表示线的颜色。
        dataSet.valueLineColor = Color.parseColor("#ffffff")
        //        设置Y值的位置是在圆内还是圆外
        dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
        //        设置Y轴描述线和填充区域的颜色一致
        dataSet.isUsingSliceColorAsValueLineColor = false
        //        设置每条之前的间隙
        dataSet.sliceSpace = 0.1f

        // 设置饼状Item被选中时变化的距离
        dataSet.selectionShift = 5f
        // 填充数据
        val pieData = PieData(dataSet)
        // 格式化显示的数据为%百分比
        pieData.setValueFormatter(object : ValueFormatter()
        {
            override fun getPieLabel(value: Float, pieEntry: PieEntry): String
            {
                return pieEntry.value.toInt().toString() + "人 (" + String.format("%.1f", value) + "%)"
            }
        })
        // 显示试图
        chart.data = pieData
    }

    /**
     * 显示实心圆
     */
    fun showSolid(yvals: List<PieEntry>, colors: List<Int>)
    {
        // 数据集合
        val dataset = PieDataSet(yvals, "")
        // 填充每个区域的颜色
        dataset.colors = colors
        // 是否在图上显示数值
        dataset.setDrawValues(true)
        // 文字的大小
        dataset.valueTextSize = 14f
        // 文字的颜色
        dataset.valueTextColor = textColor
        // 文字的样式
        dataset.valueTypeface = Typeface.DEFAULT

        // 当值位置为外边线时，表示线的前半段长度。
        dataset.valueLinePart1Length = 0.5f
        // 当值位置为外边线时，表示线的后半段长度。
        dataset.valueLinePart2Length = 0.1f
        // 当ValuePosits为OutsiDice时，指示偏移为切片大小的百分比
        dataset.valueLinePart1OffsetPercentage = 80f
        // 当值位置为外边线时，表示线的颜色。
        dataset.valueLineColor = Color.parseColor("#ffffff")
        // 设置Y值的位置是在圆内还是圆外
        dataset.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
        // 设置Y轴描述线和填充区域的颜色一致
        dataset.isUsingSliceColorAsValueLineColor = false
        // 设置每条之前的间隙
        dataset.sliceSpace = 0.5f

        // 设置饼状Item被选中时变化的距离
        dataset.selectionShift = 5f
        // 填充数据
        val pieData = PieData(dataset)
        // 格式化显示的数据为%百分比
        pieData.setValueFormatter(PercentFormatter(chart))
        // 显示试图
        chart.data = pieData
    }
}